package visiopuce.service.document;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.List;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRichTextString;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;

import visiopuce.ApplicationContexte;
import visiopuce.objets.Analyse;
import visiopuce.objets.Cotation;
import visiopuce.objets.Personne;
import visiopuce.objets.Prelevement;
import visiopuce.objets.Resultat;
import visiopuce.objets.Utilisateur;
import visiopuce.service.AnalyseServiceImpl;
import visiopuce.service.CotationServiceImpl;
import visiopuce.service.PersonneServiceImpl;
import visiopuce.service.PrelevementServiceImpl;
import visiopuce.service.ResultatServiceImpl;
import visiopuce.service.UtilisateurServiceImpl;

public class FeuilleCotation {

	public void createDocument() {
		String nomFichierout = "";
		try {
			String[] cotationcytoS = { "A9005", "A9105", "AN200", "AN206", "A0901", "AB027", "AB046", "AB047", "A0903", "A0904", "A0905", "AB023", "AB036", "AN207", "AB011", "AB015", "AB018", "AB026", "AB029", "AB030", "AB031", "AB037", "AB038", "AN103" };
			String[] cotationcytoLA = { "A9005", "AN200", "AN206", "A0041", "A4031", "AB047", "AQ012", "AQ020", "A0903", "A0904", "A0905", "AB023", "AB036", "AN207", "A0040", "AB002", "AB004", "AB046", "AB003", "AB026", "AB029", "AB030", "AB031", "AB037", "AB038" };
			String[] cotationcytoVC = { "A9005", "AN200", "AN206", "A0040", "A0041", "A4031", "AB001", "AB047", "AQ012", "A0903", "A0904", "A0905", "AB023", "AB036", "AN207", "AB002", "AB003", "AB004", "AB046", "AQ020", "AB026", "AB029", "AB030", "AB031", "AB037", "AB038" };
			String[] cotationcytoF = { "A9005", "A9105", "AN200", "AN206", "A0902", "AB046", "AB047", "AB027", "A0903", "A0904", "A0905", "AB023", "AN207", "AB015", "AB002", "AB004", "AQ020", "AB026", "AB036", "AB029", "AB030", "AB031", "AB037", "AB038", "A4031" };
			String[] cotationcytoSF = { "A9005", "A9105", "AN200", "AN206", "A0902", "AB046", "AB047", "A0903", "A0904", "A0905", "AB023", "AN207", "AB011", "AB015", "AB018", "AB027", "A0040", "A0041", "AB002", "AB003", "AB026", "AB036", "AB029", "AB030", "AB031", "A4037", "A4038" };
			String[] cotationpuceP = { "A9005", "A9105", "AN200", "AN206", "AQ043" };
			String[] cotationpuceA = { "A9005", "A9105", "AN200", "AQ002", "AQ003", "AQ901", "AN923", "AQ048", "AN018", "AN014", "AB034", "AN211", "AN215", "AN216", "AB050", "AN207", "A0904", "AB023", "AB037", "AB037", "AN317", "AN308", "AN309", "AN927", "AN928", "AN929", "AN930", "A0905" };

			String[] cotation = null;
			String[] fichiers = { "S.xls", "F.xls", "LA.xls", "VC.xls", "SF.xls", "P.xls", "A.xls" };
			for (String fichier : fichiers) {

				// FileInputStream file = new FileInputStream(new
				// File(ApplicationContexte.REPERTOIRE_COTATION + fichier));
				// SimpleDateFormat formatterEN = new
				// SimpleDateFormat("yyyy.MM.dd");
				SimpleDateFormat formatterFR = new SimpleDateFormat("dd/MM/yyyy");

				// String nomFichierOut =
				// ApplicationContexte.REPERTOIRE_PROTOCOLE +
				// formatterEN.format(fp.getDateEnvoi()) + " - N°" +
				// fp.getIdFeuillePuce() + " - " + typePuce + ".xls";

				String[] titreCommun = { "Date_de_reception", "Numero", "UF_demandeur", "UF_executant", "Nom", "Prenom", "DDN", "Prescripteur", "Prelevement", "Date_de_demande", "info", "N_ Hospitalisation", "DATE_DE_RENDU", "Signature" };

				// Get the workbook instance for XLS file
				HSSFWorkbook workbook = new HSSFWorkbook();
				HSSFSheet sheet = workbook.createSheet("Feuil1");

				// ligne de titres
				HSSFRow row = sheet.createRow(0);
				short colindex = 0;
				for (String titre : titreCommun) {
					row.createCell((short) colindex, HSSFCell.CELL_TYPE_STRING).setCellValue(new HSSFRichTextString(titreCommun[colindex]));
					colindex++;
				}

				if (fichier.equals(fichiers[0])) {
					cotation = cotationcytoS;

				}
				if (fichier.equals(fichiers[1])) {
					cotation = cotationcytoF;

				}
				if (fichier.equals(fichiers[2])) {
					cotation = cotationcytoLA;
				}
				if (fichier.equals(fichiers[3])) {
					cotation = cotationcytoVC;
				}
				if (fichier.equals(fichiers[4])) {
					cotation = cotationcytoSF;
				}
				if (fichier.equals(fichiers[5])) {
					cotation = cotationpuceP;
				}
				if (fichier.equals(fichiers[6])) {
					cotation = cotationpuceA;
				}
				for (String cot : cotation) {
					row.createCell((short) colindex, HSSFCell.CELL_TYPE_STRING).setCellValue(new HSSFRichTextString(cot));
					colindex++;
				}
				int nbLigne = 1;
				List<Prelevement> prelevements = PrelevementServiceImpl.getInstance().getPrelevementByNomFichier(fichier);
				for (Prelevement prelevement : prelevements) {
					HashMap<String, String> datesCotation = new HashMap<String, String>();
					boolean aMettre = false;
					for (String cot : cotation) {
						List<Cotation> cota = CotationServiceImpl.getInstance().getCotationByPrelevementAndLibelle(prelevement.getIdPrelevement(), cot);
						if (cota.size() > 0) {
							String dateCot = "";
							if (cota != null && cota.size() >= 1) {
								for (Cotation cotation2 : cota) {
									if (cotation2.getDate() != null) {
										dateCot += formatterFR.format(cotation2.getDate()) + " ";
										if (cotation2.getDate().getYear() == new Date().getYear()) {
											aMettre = true;
										}
									}
								}
							}
							datesCotation.put(cot, dateCot.trim());
						}
					}
					if (aMettre) {
						Personne per = PersonneServiceImpl.getInstance().getPersonneById(prelevement.getPersonne().getIdPersonne());
						List<Analyse> analysesbrutes = AnalyseServiceImpl.getInstance().findAllByidPrelevement(prelevement.getIdPrelevement());
						Integer ufPresc = 0;
						Integer ufExec = 0;
						String prescripteur = "";
						String signataire = "";
						String dateRendu = "";

						for (Analyse analyse : analysesbrutes) {
							if (fichier.equals("S.xls") || fichier.equals("F.xls") || fichier.equals("LA.xls") || fichier.equals("VC.xls") || fichier.equals("SF.xls")) {
								if (analyse.getTypeAnalyse().getIdTypeAnalyse() != 2 && analyse.getTypeAnalyse().getIdTypeAnalyse() != 3 && analyse.getTypeAnalyse().getIdTypeAnalyse() != 4 && analyse.getTypeAnalyse().getIdTypeAnalyse() != 6) {
									if (analyse.getUfPresc() != null && analyse.getUfPresc() != 0) {
										ufPresc = analyse.getUfPresc();
									}
									if (analyse.getUfExec() != null && analyse.getUfExec() != 0) {
										ufExec = analyse.getUfExec();
									}
									if (analyse.getPrescripteur() != null) {
										prescripteur = analyse.getPrescripteur().getNom();
									}
									if (analyse.getPrescripteur2() != null) {
										prescripteur += "/" + analyse.getPrescripteur2().getNom();
									}
									if (analyse.getPrescripteur3() != null) {
										prescripteur += "/" + analyse.getPrescripteur3().getNom();
									}
									if (analyse.getNomPrenomAutrePresc() != null && !analyse.getNomPrenomAutrePresc().isEmpty()) {
										prescripteur += "/" + analyse.getNomPrenomAutrePresc();
									}
									List<Resultat> resultats = ResultatServiceImpl.getInstance().findAllByidAnalyse(analyse.getIdAnalyse());
									for (Resultat resultat : resultats) {
										if (resultat.getSignataire() != null) {
											Utilisateur sign = UtilisateurServiceImpl.getInstance().getUtilisateurById(resultat.getSignataire().getIdUtilisateur());
											signataire = sign.getPrenom().substring(0, 1).toUpperCase() + sign.getNom().substring(0, 1).toUpperCase();
										}
										if (resultat.getDateRendu() != null) {
											dateRendu = formatterFR.format(resultat.getDateRendu());
										}
									}
								}
							}
							if (fichier.equals("A.xls") || fichier.equals("P.xls")) {
								if (analyse.getTypeAnalyse().getIdTypeAnalyse() == 2 || analyse.getTypeAnalyse().getIdTypeAnalyse() == 3 || analyse.getTypeAnalyse().getIdTypeAnalyse() == 4 || analyse.getTypeAnalyse().getIdTypeAnalyse() == 6) {
									if (analyse.getUfPresc() != null && analyse.getUfPresc() != 0) {
										ufPresc = analyse.getUfPresc();
									}
									if (analyse.getUfExec() != null && analyse.getUfExec() != 0) {
										ufExec = analyse.getUfExec();
									}
									if (analyse.getPrescripteur() != null) {
										prescripteur = analyse.getPrescripteur().getNom();
									}
									if (analyse.getPrescripteur2() != null) {
										prescripteur += "/" + analyse.getPrescripteur2().getNom();
									}
									if (analyse.getPrescripteur3() != null) {
										prescripteur += "/" + analyse.getPrescripteur3().getNom();
									}
									if (analyse.getNomPrenomAutrePresc() != null && !analyse.getNomPrenomAutrePresc().isEmpty()) {
										prescripteur += "/" + analyse.getNomPrenomAutrePresc();
									}
									List<Resultat> resultats = ResultatServiceImpl.getInstance().findAllByidAnalyse(analyse.getIdAnalyse());
									for (Resultat resultat : resultats) {
										if (resultat.getSignataire() != null) {
											Utilisateur sign = UtilisateurServiceImpl.getInstance().getUtilisateurById(resultat.getSignataire().getIdUtilisateur());
											signataire = sign.getPrenom().substring(0, 1).toUpperCase() + sign.getNom().substring(0, 1).toUpperCase();
										}
										if (resultat.getDateRendu() != null) {
											dateRendu = formatterFR.format(resultat.getDateRendu());
										}
									}
								}
							}
						}

						HSSFRow rowi = sheet.createRow(nbLigne);
						if (prelevement.getDateReception() != null) {
							rowi.createCell((short) 0, HSSFCell.CELL_TYPE_STRING).setCellValue(formatterFR.format(prelevement.getDateReception()));
						}
						rowi.createCell((short) 1, HSSFCell.CELL_TYPE_STRING).setCellValue(prelevement.getNumeroPrelevement());

						rowi.createCell((short) 2, HSSFCell.CELL_TYPE_NUMERIC).setCellValue(ufPresc);
						rowi.createCell((short) 3, HSSFCell.CELL_TYPE_NUMERIC).setCellValue(ufExec);

						rowi.createCell((short) 4, HSSFCell.CELL_TYPE_STRING).setCellValue(per.getNom());
						rowi.createCell((short) 5, HSSFCell.CELL_TYPE_STRING).setCellValue(per.getPrenom());
						if (per.getDateNaissance() != null) {
							rowi.createCell((short) 6, HSSFCell.CELL_TYPE_STRING).setCellValue(formatterFR.format(per.getDateNaissance()));
						}

						rowi.createCell((short) 7, HSSFCell.CELL_TYPE_STRING).setCellValue(prescripteur);
						if (prelevement.getTypePrelevement() != null) {
							rowi.createCell((short) 8, HSSFCell.CELL_TYPE_STRING).setCellValue(prelevement.getTypePrelevement().getLibelle());
						}
						if (prelevement.getDatePrelevement() != null) {
							rowi.createCell((short) 9, HSSFCell.CELL_TYPE_STRING).setCellValue(formatterFR.format(prelevement.getDatePrelevement()));
						}
						rowi.createCell((short) 10, HSSFCell.CELL_TYPE_STRING).setCellValue(prelevement.getInfoIndication());
						rowi.createCell((short) 11, HSSFCell.CELL_TYPE_STRING).setCellValue(per.getNumSejour());

						rowi.createCell((short) 12, HSSFCell.CELL_TYPE_STRING).setCellValue(dateRendu);
						rowi.createCell((short) 13, HSSFCell.CELL_TYPE_STRING).setCellValue(signataire);

						int indCot = 14;
						for (String cot : cotation) {
							if (datesCotation.containsKey(cot)) {
								rowi.createCell((short) indCot, HSSFCell.CELL_TYPE_STRING).setCellValue(datesCotation.get(cot).trim());
							}
							indCot++;
						}
						nbLigne++;
					}

				}
				Date d = new Date();
				SimpleDateFormat sdf = new SimpleDateFormat("dd_MM_yyyy");
				FileOutputStream fic = new FileOutputStream(ApplicationContexte.REPERTOIRE_COTATION + sdf.format(d) + "_" + fichier);
				workbook.write(fic);
				fic.close();

			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}
